#include <bits/stdc++.h>
using namespace std;
const int N = 15007;
struct NODE
{
	int ai, ti, fi, vi;
	bool operator<(const NODE &b) const
	{ // 重载小于号，优先级越高，在前面，优先级相同，到达时间早的排在前面
		if (vi == b.vi)
			return ti > b.ti;
		return vi < b.vi;
	}
} tmp, p[N];
priority_queue<NODE, vector<NODE>, less<NODE>> q; // 定义一个大根堆
int now, cnt = 1;

int main()
{
	while (cin >> p[cnt].ai >> p[cnt].ti >> p[cnt].fi >> p[cnt].vi)
		cnt++;
	cnt--; // cnt多了一位，所有要--
	q.push(p[1]);
	now = p[1].ti;
	for (int i = 2; i <= cnt; i++) // 让所有打饭的人到达现场，并且打完饭就走
	{
		while (!q.empty() && p[i].ti >= now + q.top().fi) // 当前的时间加上队头的时间小于第i项事务到达的时间，前面的人正常进行
		{
			now += q.top().fi; // 更新now
			cout << q.top().ai << " " << now << endl;
			q.pop();
		}
		if (!q.empty()) // 第i项事务到达的时候
		{
			tmp = q.top(), q.pop();
			tmp.fi -= p[i].ti - now; // 被中止的事务还需要多少时间才能完成
			q.push(tmp);			 // 重新入队
		}
		q.push(p[i]);  // 第i个事务入队
		now = p[i].ti; // 将时间更新为第i个人到达的时间
	}
	while (!q.empty()) // 没打完饭的人，打饭，按优先级，打完输出
	{
		tmp = q.top(), q.pop();
		cout << tmp.ai << " " << now + tmp.fi << endl;
		now += tmp.fi;
	}
	return 0;
}